﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Configuration;
using System.IO;
using NKYCurveV5;
using ItaUni.NK.Negocio.YieldCurve.VB6;
using ItaUni.NK.Utilitarios;
using RMDatasVB6v03;
using System.Collections;

namespace Curva_Interpolada
{
    class Program
    {
        #region "Principal"
        static oDatas oDt;

        static void Main(string[] args)
        {
            DataSet dsRXML = new DataSet();
            Banco oBanco = new Banco();
            YieldCurvePronta oYieldVB6 = null;
            DateTime dtDataRef= new DateTime(2010,1,1);
            DateTime dtINI = new DateTime(2010, 1, 1);
            DateTime dtFIM = new DateTime(2010, 1, 1);
            DateTime dtVigencia = new DateTime(2010, 1, 1);
            DateTime dtVencimento = new DateTime(2010, 1, 1);
            DateTime dtDtHoraExecLib = new DateTime(2010, 1, 1);
            short stTipoYield = 0;
            int iAnosExt=0;
            int iCodCurva = 0;
            int iDataBase = 0;
            int nroRegistros = 0;
            try
            {
                if (LerXML(ConfigurationSettings.AppSettings["CaminhoXML"], ref dsRXML))
                {
                    foreach (DataRow drXML in dsRXML.Tables[0].Rows)
                    {
                        if (drXML["ProcCurva"].ToString().Trim()=="1")
                        {
                           //DataSet ds = new DataSet();
                           //int s = oBanco.ConsultaCurvas(10);
                           //oBanco.ConectaDb2(ConfigurationSettings.AppSettings["Ambiente"].ToString());
                           //ds = oBanco.Load_CNX();

                            stTipoYield = Convert.ToSByte(drXML["CodTipoYield"]);

                            if (drXML["AnosExt"].ToString() == "") //Se AnosExt não estiver setado no arquivo XML, procura na base.
                            {
                                iAnosExt = oBanco.ConsultaCurvas(Convert.ToInt32(drXML["CodCurvaNovo"]));
                            }
                            else
                            {
                                iAnosExt = Convert.ToInt32(drXML["AnosExt"]);
                            }

                            ArrayList alLinhas = new ArrayList(); //Armazena as linhas de texto para ser colocado noa arquivos

                            dtINI = Convert.ToDateTime(drXML["DataRefCurvaInicio"]);
                            dtFIM = Convert.ToDateTime(drXML["DataRefCurvaFim"]);
                            int iQtde_Dias = (dtFIM - dtINI).Days;
                            dtDataRef = dtINI;

                            // Laço para ler o Período da Curva
                            for (int i = 0; i <= iQtde_Dias; i++ )
                            {
                                alLinhas.Clear();
                                try
                                {
                                    oDt = null;
                                    oYieldVB6 = MontarCurvaPronta((long)dtDataRef.ToOADate(), drXML["NomeYield"].ToString().Trim(), drXML["NomeCurva"].ToString().Trim(), stTipoYield, Convert.ToInt32(drXML["AnosExt"]));

                                    // Variáveis usadas para insersão das curvas na função oBanco.InsereCurvaBD2
                                    dtDtHoraExecLib = dtDataRef.AddHours(09);
                                    iCodCurva =Convert.ToInt32(drXML["CodCurvaNovo"].ToString());

                                    //Consultar a vigencia na base DB2.
                                    //dtVigencia = Convert.ToDateTime(drXML["DataVigencia"]);
                                    dtVigencia = oBanco.ConsultaVigenciaCurva(iCodCurva, dtDtHoraExecLib);
                                    //--------------------------------------------------------------------------

                                    int iDiasCorridos = 0;
                                    
                                    // Laço para incluir as curvas de acordo com a quantidade de AnoExt
                                    List<PontoCurva> listaPontos = new List<PontoCurva>();
                                    for (int iContData = (int)dtDataRef.ToOADate(); iContData <= (long)DateTime.FromOADate((int)dtDataRef.ToOADate()).AddYears(iAnosExt).ToOADate(); iContData++)
                                    {
                                        PontoCurva ponto = new PontoCurva();
                                        ponto.dtVencimento = DateTime.FromOADate(Convert.ToDouble(iContData));
                                        ponto.dValorVertice = oYieldVB6.ValueAtDate(ref iContData);
                                        iDataBase=oYieldVB6.DtBase;
                                        ponto.iDiasUteis = oDt.get_difdu(ref iDataBase, ref iContData);
                                        ponto.iDiasCorridos = iDiasCorridos;
                                        iDiasCorridos ++;
                                        ponto.dtDtHoraExecLib = dtDtHoraExecLib;
                                        ponto.dtVigencia = dtVigencia;
                                        ponto.iCodCurva = iCodCurva;
                                        listaPontos.Add(ponto);
                                    }
                                    
                                    oBanco.InsereCurvaBD2(iCodCurva, dtVigencia, dtDtHoraExecLib, 40, 0, 
                                        dtDtHoraExecLib, listaPontos);
                                    nroRegistros += listaPontos.Count;

                                    // Gera linha de texto para o arquivo de relatório de curva
                                    alLinhas.Add(String.Format("{0}\t CodCurvaNK:{1}\t CodCurvaNovo:{2}\t NmCurva:{3} \t AnosExt:{4} \t DataRefInserida:{5} \t Qte Registros: {6} - OK ", 
                                        DateTime.Now.ToString("dd-MM-yyyy HH:mm:ss"),
                                        drXML["CodCurvaNK"].ToString(), drXML["CodCurvaNovo"].ToString(), drXML["NomeCurva"].ToString(), drXML["AnosExt"].ToString(),
                                        dtDataRef.ToString("dd-MM-yyyy HH:mm:ss"), nroRegistros));
                                }
                                catch (YCVB6Exception) // Caso curva não exista passa direto adicionando mais um dia na data
                                {
                                    alLinhas.Add(String.Format("{0}\t CodCurvaNK:{1}\t CodCurvaNovo:{2}\t NmCurva:{3} \t AnosExt:{4} \t DataRefInserida:{5} \t Qte Registros: {6} - NAO ENCONTRADA",
                                        DateTime.Now.ToString("dd-MM-yyyy HH:mm:ss"),
                                        drXML["CodCurvaNK"].ToString(), drXML["CodCurvaNovo"].ToString(), drXML["NomeCurva"].ToString(), drXML["AnosExt"].ToString(),
                                        dtDataRef.ToString("dd-MM-yyyy HH:mm:ss"), nroRegistros));

                                    oYieldVB6 = null;
                                }
                                catch (Exception ex)
                                {
                                    alLinhas.Add(String.Format("{0}\t CodCurvaNK:{1}\t CodCurvaNovo:{2}\t NmCurva:{3} \t AnosExt:{4} \t DataRefInserida:{5} \t Qte Registros: {6} - ERRO",
                                        DateTime.Now.ToString("dd-MM-yyyy HH:mm:ss"),
                                        drXML["CodCurvaNK"].ToString(), drXML["CodCurvaNovo"].ToString(), drXML["NomeCurva"].ToString(), drXML["AnosExt"].ToString(),
                                        dtDataRef.ToString("dd-MM-yyyy HH:mm:ss"), nroRegistros));
                                    oYieldVB6 = null;
                                }
                                dtDataRef = dtDataRef.AddDays(1);
                                GravaTXT(drXML[0].ToString(), alLinhas);
                                oYieldVB6 = null;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
            }
            int a = 0;
        }
        #endregion""

        #region "Leitura e Escrita de Arquivos"

        public static bool LerXML(string sCaminho, ref DataSet dsXML)
        {
            try
            {
                dsXML.ReadXml(sCaminho);
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        public static void GravaTXT(string sNomeArq, ArrayList sTexto)
        {
            sNomeArq += "_" + DateTime.Now.ToShortDateString().ToString().Replace("/", "") + ".TXT";
            StreamWriter swArquivo = new StreamWriter(ConfigurationSettings.AppSettings["CaminhoArq"] + "\\" + sNomeArq, true);
           
            try
            {
                foreach (string s in sTexto)
                {
                    swArquivo.WriteLine(s);
                }
            }
            catch (Exception ex)
            {
            }
            finally
            {
                swArquivo.Flush();
                swArquivo.Close();
            }
        }

        #endregion "Leitura e Escrita de Arquivos"

        #region "Interpolação de Curva"

        public static YieldCurvePronta MontarCurvaPronta(long dataBase, string nomeYield, string nomeCurva, short tipoCurva, int anosExtensao)
        {
            YCVB6_Wrapper yieldVB6 = new YCVB6_Wrapper();
            YieldCurvePronta yield = null;
            try
            {
                oDt = new Datas_Wrapper().RetornarDatas(DateTime.FromOADate(dataBase));

                //yieldVB6.Ambiente = _ambiente;
                if (ConfigurationSettings.AppSettings["Ambiente"] == "H")
                {
                    yieldVB6.Ambiente = Configuracao.Ambiente.Homologacao;
                }
                else if (ConfigurationSettings.AppSettings["Ambiente"] == "P")
                {
                    yieldVB6.Ambiente = Configuracao.Ambiente.Producao;
                }

                yieldVB6.Datas = oDt;
                yieldVB6.DataBase = (int)dataBase;
                yieldVB6.NomeCurva = nomeCurva;
                yieldVB6.NomeYield = nomeYield;
                yieldVB6.TipoCurva = tipoCurva;
                yieldVB6.DataLimite = (long)DateTime.FromOADate(dataBase).AddYears(anosExtensao).ToOADate();

                yield = yieldVB6.MontarCurvaPronta();


                if (yield.MsgErro != "")
                {
                    throw new Exception(yield.MsgErro);
                }
            }
            catch (YCVB6Exception ex) // Caso curva não exista passa direto adicionando mais um dia na data
            {
                throw ex;
            }

            return yield;

        }

        #endregion""
    }

    public class PontoCurva
    {
        public int iCodCurva;
        public DateTime dtVigencia;
        public DateTime dtDtHoraExecLib;
        public int iStatus = 40;
        public int iCodTipoEventoNotificacao = 0;
        public DateTime dtVencimento;
        public Double dValorVertice;
        public int iDiasCorridos;
        public int iDiasUteis;
        public int iIndicadorDeVertice = 1;
    }
}
